iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
自我挑戰組

用數據守護雙眼:生活型態對視力影響的探索性資料分析系列 第 7 篇

症狀量表深度透視!箱形圖與小提琴圖實作

  • 分享至 

  • xImage
  •  

針對受試者自評的「眼睛乾澀程度(Eye_Dryness_Level)」與「眼痛程度(Eye_Pain_Level)」兩大核心生理指標,利用箱形圖與小提琴圖檢視其集中趨勢、分散程度與離群值型態。

一、實作前情境:為什麼量表評分特別適合小提琴圖?
昨天我們用直方圖看完了連續型變數(螢幕時間、睡眠時間)。但今天的兩個核心症狀指標:

  • Eye_Dryness_Level(眼睛乾澀程度,0~10 分)
  • Eye_Pain_Level(眼痛程度,0~10 分)

這類自評量表屬於離散型數值。若僅依賴平均值(乾澀4.71分、眼痛5.08分),容易忽略資料的分佈型態,無法辨識樣本是多數集中於中位數5分的單峰分佈,抑或呈現兩極化(低分組與重度症狀組並存)的雙峰特徵。

因此,今天結合兩種互補的統計圖表:箱形圖:精準標出中位數(Q2)、上四分位數(Q75)、下四分位數(Q25)以及是否有超過1.5xIQR的極端離群值。小提琴圖:結合核密度估計(KDE),展示分數在各刻度上的胖瘦厚度,一眼看出分數在量表兩端的擁擠程度。

二、撰寫雙指標視覺化腳本
在同一個Colab筆記本中新增儲存格,延續昨天封裝好的my_font字型物件進行繪圖:

# ==========================================
# Day7:症狀量表視覺化(箱形圖+小提琴圖)
# ==========================================

import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

# 確保引用已下載的字型
font_path = 'NotoSansTC-Regular.otf'
my_font = fm.FontProperties(fname=font_path)

# 1.建立2x2畫布佈局
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
sns.set_theme(style="whitegrid")

# 圖1:眼睛乾澀程度 (箱形圖) ---
sns.boxplot(y=df['Eye_Dryness_Level'], ax=axes[0, 0], color='#4a90e2', width=0.4)
axes[0, 0].set_title('眼睛乾澀程度分佈 (箱形圖)', fontproperties=my_font, fontsize=13, fontweight='bold')
axes[0, 0].set_ylabel('乾澀評分 (0-10 分)', fontproperties=my_font, fontsize=11)

# 圖2:眼睛乾澀程度 (小提琴圖) ---
sns.violinplot(y=df['Eye_Dryness_Level'], ax=axes[0, 1], color='#4a90e2', inner='quartile')
axes[0, 1].set_title('眼睛乾澀程度密度分佈 (小提琴圖)', fontproperties=my_font, fontsize=13, fontweight='bold')
axes[0, 1].set_ylabel('乾澀評分 (0-10 分)', fontproperties=my_font, fontsize=11)

# 圖3:眼痛/眼壓不適程度 (箱形圖) ---
sns.boxplot(y=df['Eye_Pain_Level'], ax=axes[1, 0], color='#e26a6a', width=0.4)
axes[1, 0].set_title('眼痛程度分佈 (箱形圖)', fontproperties=my_font, fontsize=13, fontweight='bold')
axes[1, 0].set_ylabel('眼痛評分 (0-10 分)', fontproperties=my_font, fontsize=11)

# 圖4:眼痛/眼壓不適程度 (小提琴圖) ---
sns.violinplot(y=df['Eye_Pain_Level'], ax=axes[1, 1], color='#e26a6a', inner='quartile')
axes[1, 1].set_title('眼痛程度密度分佈 (小提琴圖)', fontproperties=my_font, fontsize=13, fontweight='bold')
axes[1, 1].set_ylabel('眼痛評分 (0-10 分)', fontproperties=my_font, fontsize=11)

plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20260921/20178794NXC24HXKgp.png

三、圖表解讀與統計觀察
由輸出的2×2視覺化圖表,可深入解析兩項自評症狀量表的集中趨勢與分佈形狀:
1.箱形圖解析:標準分佈且無統計離群值

  • 眼睛乾澀程度 (Eye_Dryness_Level):中位數(Q2)精確落在5.0分,下四分位數(Q1)為2.0分,上四分位數(Q3)為7.0分,四分位距(IQR=5.0)。上下鬚線涵蓋了0至10分的完整範圍,未出現任何超出1.5xIQR的離群點。
  • 眼痛程度 (Eye_Pain_Level):中位數同樣為5.0分,Q1為2.0分,Q3達到8.0分(IQR=6.0),顯示眼痛程度在高分段的分散程度略大於乾澀指標。整體數值邊界同樣收斂於0至10分內,資料完整且無極端噪聲。

2.小提琴圖解析:均勻多峰與密度分佈

  • 右側小提琴圖內部的三條虛線分別對應了Q1、中位數與Q3,圖體輪廓由核密度估計(KDE)擬合而成。
  • 眼睛乾澀程度:琴身在約2分與7分附近呈現向外膨脹的輪廓,反映出低度不適與中高度乾澀兩群受試者並存的分佈特徵。
  • 眼痛程度:琴體腹部呈現上下相對寬闊的桶狀形態,各評分刻度的人數分佈相對均勻,未出現極端集中於單一分數的尖銳單峰。
  • 註:小提琴圖上下延伸至負數與大於10的部分,為Seaborn進行KDE高斯平滑估計時產生的邊界延伸效應,原始資料嚴格落於0~10分之內。

這兩項指標在500位受試者中呈現出足夠的離散度與個體差異,且中位數均位於量表中點,為後續與生活因子進行交叉關聯分析建立了極佳的基礎。


上一篇
開啟視覺化篇章!單變數分佈探索(直方圖與 KDE 圖實作)
下一篇
邁向雙變數探索!螢幕時長與眼部症狀的散佈圖與趨勢擬合
系列文
用數據守護雙眼:生活型態對視力影響的探索性資料分析 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言